#include "wwdg.h"

void WWDG_Init(void)
{
	/*使能WWDG时钟*/
	RCC->APB1ENR |= (1<<11);

	/*配置WWDG控制器*/
	WWDG->CR |= (0x7F<<0);//计数器重置为111 1111（0x7F）
	WWDG->CFR |= (3<<7);//分频8
	WWDG->CFR |= (0x7F<<0);//窗口值：111 1111（0x7F）

	/*开启中断*/
	//在CFR开启提前唤醒中断
	WWDG->CFR |= (1<<9);
	//设置中断优先级
	NVIC_SetPriority(WWDG_IRQn,NVIC_EncodePriority(7-2,1,1));//给WWDG设置优先级为(1,1)
	//使能中断源
	NVIC_EnableIRQ(WWDG_IRQn);

	/*开启窗口看门狗*/
	WWDG->CR |= (1<<7);
}


/************************************************************************
*函数名：WWDG_SetPSC
*函数功能：设置WWDG分频
*函数参数：WWDG_enum psc，分频值
*函数返回值：无
*函数说明：
*************************************************************************/
void WWDG_SetPSC(WWDG_enum psc)
{
	WWDG->CFR &= ~	(3<<7);
	WWDG->CFR |= 		(psc<<7);
}


/************************************************************************
*函数名：WWDG_SetWindow
*函数功能：设置WWDG窗口值
*函数参数：u8 window
*函数返回值：无
*函数说明：窗口值范围：0~127
*************************************************************************/
void WWDG_SetWindow(u8 window)
{
	WWDG->CFR &= ~	(0x7F<<0);
	WWDG->CFR |= 		(window<<0);
}

/************************************************************************
*函数名：WWDG_Feed
*函数功能：WWDG喂狗
*函数参数：无
*函数返回值：无
*函数说明：
*************************************************************************/
void WWDG_Feed(void)
{
	WWDG->CR |= (0x7F<<0);
}

/************************************************************************
*函数名：WWDG_IRQHandler
*函数功能：WWDG中断服务函数
*函数参数：无
*函数返回值：无
*函数说明：
*************************************************************************/
void WWDG_IRQHandler(void)
{
	if (WWDG->SR & (1<<0))//如果计数器值达到0x40
	{
		WWDG->SR &= ~(1<<0);
		WWDG_Feed();//喂狗
	}
}
